热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

主调|大侠_重温C++

篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温C++相关的知识,希望对你有一定的参考价值。 C++ 1 子函数可以把定义放在MAIN函数前, 实现在MAIN函数后

篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温C++相关的知识,希望对你有一定的参考价值。


C++
1 子函数可以把定义放在MAIN函数前, 实现在MAIN函数后
2 函数之间的值传和地址传方式

call()

vector<string> name;
string lastname
who_is(&name,&lastname);
cout<<name<<endl;

void who_is(vector<string> *p_firstname,string *p_lastname)

string l_v_str_firstname("曾");
string l_v_str_lastname("大侠");
*p_lastname&#61;l_v_str_firstname;
p_firstname->push_back(l_v_str_firstname);

调用函数call把本地变量的name地址传给被调用函数who_is

被调函数声明为指针 string *p_name
给指针赋值 *p_lastname&#61;l_v_str_firstname;
给指针赋地址 p_name&#61;&l_v_str_firstname

被调函数who_is 不能把函数内部的变量传到外面去&#xff0c;因为函数调用完后就被清除了。
这样函数内部要把工作结果返回出去&#xff0c;一方面可以通过RETRUN 可惜只能返回1个。
要多个必须主调函数把外面的变量地址传进来&#xff0c;然后给这个地址空间赋值&#xff0c;真实的值。

上面指针比较容易让人混淆&#xff0c;主要是跟普通变量相比。
很容易给指针赋值写成了 p_name&#61;l_v_str_firstname。这实际上把指针里面的地值替换成新的内存地址。
对指针是4个字节32位的存储空间&#xff0c;里面只存放内存地址。
另外个混淆的地方就是指针定义和指针使用 string *p 定义指针 *p&#61; 取指针里面的值。

另还有个引用传值

call()

vector<string> name;
string lastname
who_is(name,lastname);
cout<<name<<endl;

void who_is(vector<string> &p_firstname,string &p_lastname)

string l_v_str_firstname("曾");
string l_v_str_lastname("大侠");
p_lastname&#61;l_v_str_firstname;
p_firstname.push_back(l_v_str_firstname);

这里主调函数不用&方式把地址传进去&#xff0c;而被调函数通过&方式声明使用主调函数变量的地址
在被调函数内部直接使用该变量&#xff0c;声明形式的变量

p_lastname&#61;l_v_str_firstname;
p_firstname.push_back(l_v_str_firstname);

直接赋值不用*来表示&#xff0c;访问成员函数不用-> 而代替的是.
这或许是C&#43;&#43;避免让大家混淆吧&#xff01;
这种方式干净简单不乱&#xff0c;建议使用。如果编辑存C就无法使用。

大家对&#xff23;或者&#xff23;&#xff0b;&#xff0b;感兴趣&#xff0c;可以在自己的虚拟机上编程一下
linux c/c&#43;&#43; hello word
https://blog.csdn.net/ZengMuAnSha/article/details/5826949
这篇小仙的博客老早以前在LINUX下写的。

Linux下C&#43;&#43;连接oracle数据库 OCCI 接口
https://blog.csdn.net/ZengMuAnSha/article/details/51438251
这篇也是在LINUX下使用ORACLE公司免费的IDE NETBEAN8 C&#43;&#43;版本
然后再使用ORACLE公司提供的OCCI库&#xff0c;开发个ORACLE数据库的DEMO
最主要的是NETBEAN8可以支持中文版。有IDE支持很多配置易如反掌&#xff01;
文中的11.2.0.4 SDK下载地址早已失效了

SDK下载地址:
https://download.oracle.com/otn/linux/instantclient/11204/instantclient-sdk-linux.x64-11.2.0.4.0.zip?AuthParam&#61;1575559586_5112f43f5a3f136e263c2afa58b8d757
BAISC:
https://download.oracle.com/otn_software/linux/instantclient/195000/instantclient-basic-linux.x64-19.5.0.0.0dbru.zip
这两个就是OCCI库,都是免费下载的. 不过你只需要注册免费的ORACLE账号就行.

使用IDE在LINUX下编程,自然需要图形界面,LINUX下的XWINDOX系统,还有个GNOME桌面系统. 一般情况下我装系统都会带图形支持,然后INIT3切换到字符界面上. 我使用XMAGNER 的XPASSVIE 什么鬼的工具,可把NETBEAN导到WIN7在操作.

我百度网盘共享一个NETBEAN 不确定是否支持C&#43;&#43;,你可以直接上ORACLE官方下.
https://pan.baidu.com/s/16vvlRqjBZkbYCRXKK5IVRg 提取码:l39j
当然你不想整那么多的话,可以直接在虚拟机中的Linux图形界面编程,可以不用XSHELL.
当然NETBEAN 8需要JDK8
我使用ORACLE用户在LINUX下安装这两个家伙的. 另外环境设置下参数

export PATH&#61;$ORACLE_BASE/OPatch:$ORACLE_HOME/bin:$CRS_HOME/bin:$PATH:/sbin
export LD_LIBRARY_PATH&#61;$ORACLE_HOME/lib:$LD_LIBRARY_PATH

PATH最好是把JDK的路径放在最前面.因为虚拟机上的ORACLE也带JAVA.
ORACLE 11G 一般带JAVA7 你在LINUX下java -version 看下是否正确。
LD_LIBRARY_PATH 是库路径&#xff0c;主要调试的时候需要知道它在哪里。
这个主要是OCCI库的BASIC这个包解压的路径。

好了作为ODBA 你除了会PL/SQL,SHELL外 你还会C&#43;&#43; 你可看起来很装逼的语言&#xff1a;
下面是开发个类似ANSIBEL批量执行SQL在30台数据库服务器上

/*
* File: main.cpp
* Author: oracle
*
* Created on 2019年12月4日, 下午4:11
*/

#include
#include <iostream>
#include
#include
#include
using namespace std; //这个是C&#43;&#43;标准库
using namespace oracle::occi;//这个是OCCI库 命名空间
/*
* 先把3个函数的声明放在主函数前
*/

void Conn_Db_Exec(string user,string pwd,string conn,string sql);
void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd, vector<string> &p_v_str_conn, string s_classA,string s_classB,string s_classC,string s_dbname);
void read_sql_conf(string &psqltext,string psql_id);
int main(int argc, char** argv) //sqlid,classA,classB,classC,dbname

vector<string> m_v_user; //定义3个字符串数组
vector<string> m_v_pwd;
vector<string> m_v_conn;
string m_s_sql_text; //定义6个字符串变量
string m_s_sql_id;
string m_s_classA;
string m_s_classB;
string m_s_classC;
string m_s_dbname;
for (int i&#61;0;i<argc; i&#43;&#43;) //显示你输入的参数

cout<<"Your input Parameter:"<<endl;
cout<<argv[i]<<endl;

if (argc>0)//把输入的参数赋值给变量们

m_s_sql_id &#61;argv[0];
m_s_classA&#61;argv[1];
m_s_classB&#61;argv[2];
m_s_classC&#61;argv[3];
if (argc&#61;&#61;5)

m_s_dbname&#61;argv[4];

else

m_s_dbname.clear();

read_db_conf(m_v_user,m_v_pwd,m_v_conn,m_s_classA,m_s_classB,m_s_classC,m_s_dbname); //读入数据库连接信息
read_sql_conf(m_s_sql_text,m_s_sql_id);//读需要执行的SQL

else cout<<"You not innput parameter"<<endl;
if (m_s_sql_text.size() >0 ) //以下是对连接信息和SQL的检验

if (m_v_user.size() >0)

if(m_v_user.size()&#61;&#61;m_v_pwd.size() && m_v_user.size()&#61;&#61;m_v_conn.size())

for (int i&#61;0;i<m_v_user.size();i&#43;&#43;) //没毛病的话就循环执行SQL

cout<<m_v_user[i]<<endl;
cout<<m_v_pwd[i]<<endl;
cout<<m_v_conn[i]<<endl;
// Conn_Db_Exec(m_v_user[i],m_v_pwd[i],m_v_conn[i],m_s_sql_text); //是针对30台ORACLE数据库的哟&#xff01;

else cout<<"This Database Number is not as! user.size !&#61; pwd.size !&#61;conn.size" <<endl;
else cout<<"Not Find any database info!"<<endl;

else cout<<"Not Find any SQL TEXT info!"<<endl;
//Conn_Db_Exec(main_user,main_pwd,main_conn,main_sql);
return 0;

//以下是读取数据库配置文件&#xff0c;把3个数组的地址传进来装东西的
void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd,
vector<string> &p_v_str_conn,
string s_classA,string s_classB,string s_classC,string s_dbname)

string str_user("scott");//这先暂时存在变量里&#xff0c;将来打算存在db.conf个文件中
string str_pwd("123456");
string str_conn("192.168.2.21:1521/SHARKDB");
p_v_str_user.push_back(str_user); //把从文件读到的信息放进数组中
p_v_str_pwd.push_back(str_pwd);
p_v_str_conn.push_back(str_conn);
str_user&#61;"system";
str_pwd&#61;"123456";
str_conn&#61;"192.168.2.21:1521/SHARKDB";
p_v_str_user.push_back(str_user);
p_v_str_pwd.push_back(str_pwd);
p_v_str_conn.push_back(str_conn);
/*
p_v_str_user->push_back(str_user);
p_v_str_pwd->push_back(str_pwd);
p_v_str_conn->push_back(str_conn);*/


//同上根据SQLID从配置文件获得SQL
void read_sql_conf(string &psqltext,string psql_id)

string l_str_sqltext;
l_str_sqltext&#61;"select sysdate from dual";
psqltext&#61;l_str_sqltext;

//数据库连接执行函数&#xff0c;把上面得到的链接信息和SQL传过来
void Conn_Db_Exec(string user,string pwd,string strconn,string sql)

//以下是OCCI 4个重要指针变量 分别是环境&#xff0c;连接&#xff0c;语句&#xff0c;结果
Environment *env;
Connection *conn;
Statement *stmt;
ResultSet *rset;
// 定义4个本地变量承接参数&#xff0c;其实也没必要。
string str_user&#61;user;
string str_pwd&#61;pwd;
string str_conn&#61;strconn;
string str_sql&#61;sql;
env &#61; Environment::createEnvironment(Environment::OBJECT); //环境初始化
try

conn &#61;env->createConnection(str_user,str_pwd,str_conn);//创建连接
if(conn!&#61;NULL)
cout<<"Connect Success"<<endl;
else
cout<<"Connect Failed!"<<endl;
stmt&#61;conn->createStatement(str_sql); //创建语句
rset&#61;stmt->executeQuery(); //执行语句&#xff0c;并返回结果
while(rset->next()) //结果循环打印行

string tr_day&#61;rset->getString(1); //这里每个字段打印一下
cout<<"This Database date is :"<<tr_day<<endl;


catch(SQLException e) //异常处理

cout<<e.what()<<endl; //简单地显示异常&#xff0c;并关闭4个重要指针
stmt->closeResultSet(rset);
conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
//最后还是释放4个指针。
stmt->closeResultSet(rset);
conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);

大家可以在公众号查看本文


推荐阅读
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 本文详细探讨了 PHP 中常见的 '未定义索引' 错误,包括其原因、解决方案及最佳实践。通过实例和代码片段,帮助开发者更好地理解和处理这一常见问题。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • Google排名优化-面向Google(Search Engine Friendly)的URL设计 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
author-avatar
111222
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有